#ifndef __KERNEL_PBO_H
#define __KERNEL_PBO_H

#include "lessSimpleOperEnum.h"
#include "simpleOperEnum.h"
#include "DilationErosionEnum.h"

enum HISTOGRAM_TYPE
{
	HISTOGRAM_GRAY,
	HISTOGRAM_RED,
	HISTOGRAM_GREEN,
	HISTOGRAM_BLUE,
};

unsigned int* launch_histogram(uchar3*, unsigned int, unsigned int, HISTOGRAM_TYPE);
uchar4* launch_RGBtoCMYK(uchar3* pixel_ptr, unsigned int width, unsigned int height);
void launch_flatten(uchar3*, uchar3*, unsigned int, unsigned int);
void launch_balancing(uchar3* , uchar3*, unsigned int, unsigned int);
//template <typename S, typename T > void launch_convolution(S , T, unsigned int, unsigned int, float*, int);
void launch_convolution(uchar3* orgin_ptr, uchar3* pixel_ptr, unsigned int width, unsigned int height, float* data, int size, bool abss = false);
void launch_simpleOperation(uchar3* , uchar3*, unsigned int, unsigned int, SIMPLE_OPER, float);
void launch_byZero(uchar3* orgin_ptr, uchar3* pixel_ptr, unsigned int width, unsigned int height, float* data, int size);
void launch_lessSimpleOperation(uchar3* , uchar3*, unsigned int, unsigned int, LESS_SIMPLE_OPER, float);
void launch_gray(uchar3* orgin_ptr, uchar3* pixel_ptr, unsigned int width, unsigned int height, int max_value);
void launch_bufferSum(uchar3* orgin_ptr, uchar3* pixel_ptr, unsigned int width, unsigned int height, int param);
void launch_mediana(uchar3* orgin_ptr, uchar3* pixel_ptr, unsigned int width, unsigned int height, int size);
void launch_dilation_erosion(uchar3* orgin_ptr, uchar3* pixel_ptr, unsigned int width, unsigned int height, bool mask[], int size, DilationErosionEnum type);
void launch_houghTransform(uchar3* orgin_ptr, uchar3* pixel_ptr, unsigned int width, unsigned int height);
void launch_normalMap(uchar3* orgin_ptr, uchar3* pixel_ptr, unsigned int width, unsigned int height);
#endif

